

using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using CoreCms.Net.Configuration;
using CoreCms.Net.IRepository;
using CoreCms.Net.IRepository.UnitOfWork;
using CoreCms.Net.IServices;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.ViewModels.Basics;
using CoreCms.Net.Model.ViewModels.UI;
using CoreCms.Net.Utility.Extensions;
using CoreCms.Net.Utility.Helper;
using Newtonsoft.Json;
using SqlSugar;


namespace CoreCms.Net.Services
{
    /// <summary>
    /// 用户日历签到统计 接口实现
    /// </summary>
    public class CoreCmsUserCheckInServices : BaseServices<CoreCmsUserCheckIn>, ICoreCmsUserCheckInServices
    {
        private readonly ICoreCmsUserCheckInRepository _dal;
        private readonly IUnitOfWork _unitOfWork;
        private readonly ICoreCmsSettingServices _settingServices;
        private readonly ISysTaskLogServices _sysTaskLogServices;


        public CoreCmsUserCheckInServices(IUnitOfWork unitOfWork, ICoreCmsUserCheckInRepository dal, ICoreCmsSettingServices settingServices, ISysTaskLogServices sysTaskLogServices)
        {
            this._dal = dal;
            _settingServices = settingServices;
            _sysTaskLogServices = sysTaskLogServices;
            base.BaseDal = dal;
            _unitOfWork = unitOfWork;
        }

        /// <summary>
        ///     重写根据条件查询分页数据
        /// </summary>
        /// <param name="predicate">判断集合</param>
        /// <param name="orderByType">排序方式</param>
        /// <param name="pageIndex">当前页面索引</param>
        /// <param name="pageSize">分布大小</param>
        /// <param name="orderByExpression"></param>
        /// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
        /// <returns></returns>
        public async Task<IPageList<CoreCmsUserCheckIn>> QueryPageAsync(Expression<Func<CoreCmsUserCheckIn, bool>> predicate,
            Expression<Func<CoreCmsUserCheckIn, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
            int pageSize = 20, bool blUseNoLock = false)
        {
            return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize, blUseNoLock);
        }

        /// <summary>
        /// 清理用户连续签到
        /// </summary>
        /// <returns></returns>
        public async Task<AdminUiCallBack> ClearUserContinuousCheckIn()
        {
            var jm = new AdminUiCallBack();

            var allConfigs = await _settingServices.GetConfigDictionaries();

            var showStoresSwitch = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.CheckInIsOpen).ObjectToInt(2);   //是否开启签到
            if (showStoresSwitch == 1)
            {
                var continuousCheckInPeriodType = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ContinuousCheckInPeriodType).ObjectToInt(0);   //连续签到周期

                DateTime dt = DateTime.Now; //当前时间
                if (continuousCheckInPeriodType == (int)GlobalEnumVars.ContinuousCheckInPeriodType.不限)
                {
                    //插入日志
                    var model = new SysTaskLog
                    {
                        createTime = DateTime.Now,
                        isSuccess = true,
                        name = "不限制模式不执行",
                        parameters = JsonConvert.SerializeObject(jm)
                    };
                    await _sysTaskLogServices.InsertAsync(model);
                }
                else if (continuousCheckInPeriodType == (int)GlobalEnumVars.ContinuousCheckInPeriodType.每周末)
                {
                    if (dt.DayOfWeek == DayOfWeek.Sunday)
                    {
                        await _dal.UpdateAsync(p => new CoreCmsUserCheckIn() { continuousCheckInCount = 0 }, p => p.id > 0);
                    }
                    else
                    {
                        //插入日志
                        var model = new SysTaskLog
                        {
                            createTime = DateTime.Now,
                            isSuccess = true,
                            name = "非周末不执行",
                            parameters = JsonConvert.SerializeObject(jm)
                        };
                        await _sysTaskLogServices.InsertAsync(model);
                    }
                }
                else if (continuousCheckInPeriodType == (int)GlobalEnumVars.ContinuousCheckInPeriodType.每月末)
                {
                    DateTime startMonth = dt.AddDays(1 - dt.Day); //本月月初
                    DateTime endMonth = startMonth.AddMonths(1).AddDays(-1); //本月月末
                    //同年同业同日生。
                    if (dt.Year == endMonth.Year && dt.Month == endMonth.Month && dt.Day == endMonth.Day)
                    {
                        await _dal.UpdateAsync(p => new CoreCmsUserCheckIn() { continuousCheckInCount = 0 }, p => p.id > 0);
                    }
                    else
                    {
                        //插入日志
                        var model = new SysTaskLog
                        {
                            createTime = DateTime.Now,
                            isSuccess = true,
                            name = "非周末不执行",
                            parameters = JsonConvert.SerializeObject(jm)
                        };
                        await _sysTaskLogServices.InsertAsync(model);
                    }
                }
            }
            return jm;
        }


    }
}
